# encoding: UTF-8
'''
Created: 2014-05-02 08:21

@author: VAN
'''
    
"""
搜索模块：
当导入一个模块时，会在预定的路径下查找模块，一个模块只会被加载一次（相应的命名空间），可以被导入多次，导入模块查找顺序：系统模块，第三方模块，自定义模块（导入的体系结构）
sys.path存放了可搜索的模块的所有路径，该变量可以通过函数修改，也可以通过交互工具修改
sys.path.append(my_module_dir)添加自己模块的位置

命令空间：
在执行期间有两到三个命名空间：局部命名空间，全局命名空间，内建命名空间
python解释器先加载内建命名空间，它由__builtins__模块中的名字构成，然后执行模块的全局命名空间，若在执行期间还要调用函数，就出现第三个命名空间：局部命名空间
"""

'''
GIL(全局解释器锁 )会防止多个原生线程同时执行Python字节码。换句话说，GIL將序列化您的所有线程。可以使用线程管理多个派生进程加速程序，这些程 序独立的运行于你的Python代码外。

Python使用 GIL保护内部数据结构，确保在一次只有一个线程运行 CPython虚拟机,可以通过Oracle数据库其自身的后台锁定机制，将共享数据存储在 Oracle 数据库中，从而由 Oracle数据库处理并发性问题

使用dict 和 set 测试成员是否存在（dict和set使用哈希表来实现）；list实际是个大小可变数组

itertools：模块对迭代和组合是非常有效

无限循环使用 "while 1"

延迟加载加速（將 "import" 声明移入函数中,仅在需要的时候导入，可以更均衡的分配模块的加载时间）
'''

'''
python not distinguish value reference and class reference,all object is default class reference
Python使用对象模型来存储数据，构造任何类型的值都是一个对象。在Python的世界中，一切皆对象，一个整数是一个对象，一个字符串也是一个对象，而且类型也是一个对象，整数类型是一个对象，字符串类型也是一个cli象

对象属性：
1.身份{id()}：唯一性身份标志，是该对象的内存地址
2.类型{type()}：对象的类cli决定了该对象可以保存什么类型的值，可进行什么样的操作，以及遵循什么样的规则
3.值{str()}：对象表示的数据项


python的内部类型
1.代码：编辑过的Python源代码片段，是可执行对象，通过调用内建函数compile()可以得到代码对象，代码对象可以被exec命令和eval()内建函数执行
2.帧：Python的执行栈帧（每个帧对象都会创建一个C栈帧）。包含Python解释器在运行时所需要知道的所有信息。指向上一帧的链接，正在被执行的代码对象，本地及全局名称空间字典及当前执行指令
3.跟踪记录：当异常发生时，一个包含针对异常的栈跟踪信息的跟踪记录对象被创建（代码出错引发异常）
4.切片：使用Python扩展的切片语法时，会创建切片对象，切片对象也可以通过内建函数slice()来生成。sequence[startIndex:endIndex:step]
5省略:省略对象用于扩展切片语法中，起记号作用，在切片语法中表示省略号。
6.Xrange：调用内建函数xrang()会生成Xrange对象，xrang()是内建函数range()的兄弟版本，用于需要节省内存使用或rang()无法完成的超大数据集合


函数包含的属性：代码属性，函数名，文档字符串，默认参数，全局命名空间
'''
# Python 对象模型属性
obj = u"abc";  # unicode string,default ASCII string
print "%s %s %s" % (id(obj), type(obj), str(obj))


# Python能处理Unicode和ASCII编码:ASCII字符串成了StringType、Unicode字符串成了UnicodeType


'''
子函数可以使用父函数中的局部变量，这种行为就叫做闭包(closure)，此变量称为自由变量。
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)
'''
print '+++++++closure+++++++++'
def counter(start_at=0):
    count = [start_at]
    # 内部函数incr()实现计数
    def incr():  # 定义一个内部函数,在内部使用变量count,创建一个闭包
        count[0] += 1
        return count[0]
    return incr  # 返回一个可调用的函数对象

# 看起来和实例化一个counter对象并执行这个实例是多么相似
count = counter(5)
for i in range(3):
    print count()  # 6 7 8
    
count = counter(100)
print count()  # 101

'''
匿名函数,或者叫做lambda函数,它没有名字,只有参数和表达式。
语法：lambda [arg1[,arg2,arg3....argN]]:expression
'''
print "+++++++++anonymous++++++++"
anonymous_func = lambda  args: args * 3;
print anonymous_func(2);


'''dir() method used to list module define identifier, like variable, method, class,if no argument, list current module, else list the argument module'''

'''
python data structure:list[]-list, zoo()-tuple, dict{}-dictionary,list and zoo can contains different type item
split slice : the start position object is include the sub, the end position object is exclude the sub
example:
    list[startIndex=0:endIndex=-1:step]:[] -->subString(begin,end) {end is exclude endValue}
    zoo():(),read only list
    dict{}:{}
'''


'''
method's variable argument, like zoo,dict,*argument is zoo,(), **argument is dict{}
define ： function(positional_args,keyword_args,*tuple_grp_nonkw_args,**dict_grp_kw_args)
参数的几种传递方式：先位置，再关键字，再包裹位置，再包裹关键字
注意定义时和调用时的区分。包裹和解包裹并不是相反操作，是两个相对独立的过程
'''
print '++++++++++function invoke+++++++++'
def func(a, b, c):
    print a, b, c
   
# 位置传递
func(1, 2, 3)
# 关键字传递
func(a=1, c=2, b=3)

# *和**的是使用（解包裹）
args = (1, 3, 4)
func(*args)

kwargs = {'a':1, 'b':2, 'c':3}
func(**kwargs)
    
# 包裹位置传递
def func1(*args):
    print type(args)
    print args
    
func1(1, 3, 4)
func1(2, 5)
# 包裹关键字传递
def func2(**kwargs):
    print type(kwargs)
    print kwargs

func2(a=1, b=2)





'''
列表解析：[expr for iter_var in iterable if cond_expr], 从右到左
生成器表达式：(expr for iter_var in iterable if cond_expr)
生成器表达式是列表解析的扩张，列表是开始就必须生成所有数据，生成器是一个规则，起到延迟计算获取条目，降低内存消耗
'''
print "++++++++expr+++++++++"

s = [obj ** 2 for obj in range(8) if not obj % 2]
for i in s:
    print i;
    
def a():
    print "a"
def b():
    print "b"
def c():
    print "c"

arr = []
arr.append(a)
arr.append(b)
arr.append(c)

[v() for v in arr]
'''
repr()以字符的方式获取对象的内容，此字符串可以用来重新获取对象 obj=eval(repr(obj))

上下文管理器
with context_exclir cliasclivar]:
    with_suite

inspect模块提供了一系列函数用于帮助使用自省
'''


    
    
    



